package com.woniuxy.controller;

import com.woniuxy.entity.User;
import com.woniuxy.entity.utils.ResponseEntity;
import com.woniuxy.jwt.JWTUtils;
import com.woniuxy.service.AuthService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

/**
 * @Author: 马宇航
 * @Do: auth认证模块的登录方法
 * @DateTime: 22/06/28/0028 上午 11:20
 * @Component: 成都蜗牛学苑
 **/
@RestController
@RequestMapping("/auth")
public class AuthController {
    @Autowired
    AuthService authService;
    @Autowired
    RedisTemplate redisTemplate;
    @GetMapping("/login")
    public ResponseEntity login(String account,String password){
        //登录的时候，接收到账号密码，先用账号去数据库查出对应的用户信息，再代码中比较。
        User user = authService.findOneByAccount(account);
        if (!user.getPassword().equals(password)){
            //密码不相同则直接返回信息即可
            return ResponseEntity.ERROR;
        }
        //登录成功则表示可以生成token
        String token = JWTUtils.generateToken(account);
        //需要一个刷新token,直接通过uuid生成
        String refreshToken = UUID.randomUUID().toString();
        //以refreshToken作为reids的key，token和用户整个存入redis中
        HashMap<String, Object> redisValue = new HashMap<>();
        redisValue.put("user",user);
        redisValue.put("token",token);
        //把refreshToken作为reids的key，整个map存入redis中
        redisTemplate.opsForHash().putAll(refreshToken,redisValue);
        //需要过期时间2小时，因为token过期时间为1个小时
        redisTemplate.expire(refreshToken,2, TimeUnit.HOURS);
        //双token认证
        ResponseEntity success = ResponseEntity.SUCCESS;
        success.put("token",token);
        success.put("refreshToken",refreshToken);
        return success;
    }
}
